\newpage

\section*{Soluzione}
Analizziamo anzitutto il codice fornito.\\
Il generico elemento
della \emph{mesh} \`e definito  da un insieme di punti e da un insieme
di lati. Nell'implementazione proposta i punti sono memorizzati in un
\cpp{vector}, la cui dimensione \`e fornita come dato al costruttore.

\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Interfaccia della classe
\cpp{Shape}, linerange={17-17,56-104,135-135}]{es/es/src/shape.hpp}
\lstinputlisting[caption=Implementazione della classe
\cpp{Shape}, linerange={3-3,12-18,31-31}]{es/es/src/shape.cpp}
\lstset{basicstyle=\sf}

Si noti che il distruttore di \cpp{Shape} \`e dichiarato
\cpp{virtual}: questo consente alle classi derivate di 
\emph{sovraccaricare} il distruttore, se necessario.

Anche il metodo
\cpp{measure()} \`e dichiarato \cpp{virtual}, per lo stesso
motivo. Inoltre essendo inizializzato al valore nullo \`e
\emph{puramente virtuale}, e di conseguenza la classe \cpp{Shape} \`e
\emph{astratta}: non \`e possibile
istanziare un oggetto di tipo \cpp{Shape}, se non tramite il
costruttore di una classe derivata. Si noti anche che una funzione
puramente virtuale della classe base \textbf{deve essere definita}
nelle classi derivate: altrimenti rimane indefinita e questo rende
astratte anche le classi derivate.

% Il \emph{lato} \`e il pi\`u semplice esempio di elemento di una mesh:
% nell'implementazione proposta viene derivato dalla classe \cpp{Shape},
% di cui invoca esplicitamente il costruttore. Si noti che la classe
% derivata \cpp{Edge} fornisce la definizione del metodo \cpp{measure()}
% e non \`e quindi astratta.

% \lstset{basicstyle=\scriptsize\sf}
% \lstinputlisting[caption=La classe
% \cpp{Edge}, linerange={17-17,103-127,135-135}]{es/1/src/shape.hpp}
% \lstset{basicstyle=\sf}

% Allo stesso modo si derivano da \cpp{Shape} le classi \cpp{Triangle} e \cpp{Quadrangle}.

Le classi \cpp{Triangle} e \cpp{Quadrangle} sono derivate da \cpp{Shape}, forniscono 
la  definizione del metodo \cpp{measure()} e quindi non sono astratte. 

\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Interfaccia della classe
\cpp{Triangle}, linerange={12-39}]{es/es/src/triangle.hpp}
\lstinputlisting[caption=Implementazione della classe
\cpp{Triangle}]{es/1/src/triangle.cpp}

\lstinputlisting[caption=Interfaccia della classe
\cpp{Quadrangle}, linerange={12-42}]{es/es/src/quadrangle.hpp}
\lstinputlisting[caption=Implementazione della classe
\cpp{Quadrangle}]{es/1/src/quadrangle.cpp}
\lstset{basicstyle=\sf}

Un oggetto di classe \cpp{Mesh} istanzia i suoi membri privati sulla base delle
informazioni lette da file. Si noti che la lista di elementi \`e un
oggetto di tipo \cpp{std::vector<element_pointer_type>}, ovvero contiene puntatori
ad oggetti del tipo \emph{base} \cpp{Shape}. Tuttavia, il
meccanismo dell'\emph{ereditariet\`a pubblica} consente di
inizializzare la lista di elementi con puntatori alle classi derivate
(\cpp{Triangle} e \cpp{Quadrangle}).

Nell'implementazione dell'operatore di scorrimento si sfrutta il
\cpp{polimorfismo} per la classe \cpp{Shape} e le sue derivate:

\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Operatore \cpp{<%
<} per la classe \cpp{Shape}, linerange={3-3,20-31}]{es/es/src/shape.cpp}
\lstset{basicstyle=\sf}

L'operatore riceve come argomento un riferimento a \cpp{Shape}, quindi
non conosce a priori quale sia l'istanza dell'oggetto referenziato. \`E compito del compilatore
generare codice in grado di selezionare \emph{run-time} l'istanza
(\cpp{Triangle} o \cpp{Quadrangle}) a cui riferire la chiamata a
funzione.

\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Interfaccia della classe
\cpp{Mesh}, linerange={12-80}]{es/es/src/mesh.hpp}
\lstinputlisting[caption=Implementazione della classe
\cpp{Mesh}]{es/es/src/mesh.cpp}
\lstset{basicstyle=\sf}

\section*{Es. 1}

Per inserire tutti i lati all'interno della struttura dati, \`e possibile 
scorrete la lista degli elementi. Per ciascuno di essi si scorrono i lati,
in numero differente se essi sono triangoli o quadrangoli, e vengono inseriti
di volta in volta nella struttura dati che li contiene. Essendo un \cpp{set}
l'inserzione di elementi ripetuti \`e vietata e quindi, quando vengono inseriti
due lati uguali, il secondo viene ignorato. Per capire che due lati sono uguali
si utilizza l'operatore \cpp{<} o, alternativamente, l'operatore \cpp{==},
entrambi definiti nel file \textit{shape.hpp}. 

\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Operatori \cpp{==} e \cpp{<} per un \cpp{Edge}, linerange={179-195}]{es/sol/src/shape.hpp}
\lstset{basicstyle=\sf}

Per poter gestire l'elemento di destra
e l'elemento di sinistra di un dato lato \`e possibile aggiungere due valori che permettono
di identificare i loro rispettivi ID. Una trattazione speciale \`e riservata ai lati
di bordo che, assumiamo, hanno l'ID dell'elemento di destra non definito. Per 
gestire tale evenienza assegniamo un valore che non verr\`a mai utilizzato. Una 
possibilit\`a \`e utilizzare un ID negativo, un'altra possibili\`a, quella adottata,
\`e assegnare il numero pi\`u grande che un intero pu\`o contenere, confidando che la
mesh non contenga cos\`i tanti bordi. 

\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Gestione del lato di bordo tramite il valore \cpp{NOTSET}, linerange={19-19}]{es/sol/src/shape.hpp}
\lstset{basicstyle=\sf}

Per aggiungere tale funzionalit\`a a \cpp{buildEdges}
\`e necessario gestire l'inserimento doppio all'interno di un \cpp{set}. Una possibilit\`a
\`e attraverso la parola chiave \cpp{mutable} anteposta ai due ID degli elementi, una
possibilit\`a alternativa \`e estrarre l'elemento dal \cpp{set} e inserirlo nuovamente
con tutti i campi settati. Essendo pi\`e semplice, ma meno corretta, la seconda scelta
\`e stata implementata.

\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Inserimento dei lati con gestione dell'elemento di sinistra e di quello di destra, linerange={133-162}]{es/sol/src/mesh.cpp}
\lstset{basicstyle=\sf}

Per gestire i lati di bordo \`e possibile creare una struttura dati analoga a quella precedente
e, all'interno del metodo \cpp{buildEdges}, inserire anche i lati di bordo. Una modo \`e
inserire tutti i lati e, nel caso lo trovassi la seconda volta, lo elimino. In questo modo
i lati che saranno contenuti alla fine saranno esclusivamente quelli di bordo.

\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Inserimento dei lati di bordo, linerange={163-173}]{es/sol/src/mesh.cpp}
\lstset{basicstyle=\sf}

\section*{Es. 2}
Per risolvere tale esercizio \`e utile utilizzare l'algoritmo \cpp{find_if}
della standard template library. In particolare \`e richiesto un funtore, o una funzione, 
che funge da predicato per la valutazione dell'uguaglianza. \`E stato quindi implementato
il seguente funtore nel file \textit{mesh.hpp}

\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Predicato per \cpp{find_if}, linerange={23-37}]{es/sol/src/mesh.hpp}
\lstset{basicstyle=\sf}

In questo modo \`e possibile selezionare la lista dei punti di bordo associati ad una 
determinata condizione. Trovato il primo valore nella lista \`e possibile scorrere 
la lista restante per determinare se sono presenti o meno altri punti con la stessa
condizione al bordo. Si noti l'utilizzo dell'operatore di pre-incremento \cpp{++} per
spostare l'iteratore nella posizione successiva.

\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Metodo di \cpp{Mesh} che utilizza \cpp{find_if}, linerange={233-258}]{es/sol/src/mesh.cpp}
\lstset{basicstyle=\sf}
